package com.netty.service;

import com.netty.model.MessageWrapper;
import io.netty.channel.ChannelHandlerContext;

/**
 * 链接交互处理
 *
 * @author suzhen
 */
public interface ConnectService {

    /**
     * 发送心跳检测 到客户端
     *
     * @param handlerContext
     * @param wrapper
     */
    void heartbeatToClient(ChannelHandlerContext handlerContext, MessageWrapper wrapper);

    /**
     * 注册session
     *
     * @param ctx
     * @param wrapper
     */
    void connect(ChannelHandlerContext ctx, MessageWrapper wrapper);

    /**
     * 发送消息 == 广播
     *
     * @param ctx
     * @param wrapper
     * @throws RuntimeException
     */
    void pushMessage(ChannelHandlerContext ctx, MessageWrapper wrapper);

    /**
     * 回复消息,一对一
     *
     * @param ctx
     * @param sessionId 发送人
     * @param wrapper   发送内容
     * @throws RuntimeException
     */
    void pushMessage(ChannelHandlerContext ctx, String sessionId, MessageWrapper wrapper);

    /**
     * 发送组消息
     *
     * @param wrapper
     * @throws RuntimeException
     */
    void pushGroupMessage(MessageWrapper wrapper) throws RuntimeException;

    /**
     * 验证session
     *
     * @param wrapper
     * @return
     * @throws RuntimeException
     */
    boolean validateSession(MessageWrapper wrapper) throws RuntimeException;

    /**
     * @param handlerContext
     * @param wrapper
     */
    void close(ChannelHandlerContext handlerContext, MessageWrapper wrapper);

    void close(String sessionId);

    void close(ChannelHandlerContext handlerContext);


    boolean exist(String sessionId);

    /**
     * 获取用户唯一标识符
     *
     * @param ctx
     * @return
     */
    String getChannelSessionId(ChannelHandlerContext ctx);
}
